const Admini = require('../../util/administrator.js') //用户 
const bcrypt = require('bcrypt') //加密工具
//用于生成token下发给浏览器，在 koa2 以后的版本不再提供 jsonwebtoken 的方法,所以需要另行安装
const jsonwebtoken  = require('jsonwebtoken') 
const nameReg = /[A-Za-z0-9_\-\u4e00-\u9fa5]{4,12}/;
const pwdReg = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/;
const {secret} = require('../../util/wx_x_config.js')
const {mysql:mysqlConfig} = require('../../util/wx_x_config.js');   // mysql配置文件
const console = require('tracer').colorConsole(); // 增强console


let adminitrator = (router, opt) => {
	/**
	 * @desc 用户注册
	 * @param  {URL} '/admini/register' 注册管理员账户
	 * @return {[type]}                    [description]
	 */
	router.post('/admin/register', async (ctx, next) => {
		const { body } = ctx.request;

	    try {
	    	//效验账户明
	      if (!nameReg.test(body.username) ) {
	        ctx.status = 400;
	        ctx.body = {
	          error: `expected an object with username but got: ${body}`,
	        }
	        return;
	      }

	      //效验密码
	      if (!pwdReg.test(body.password)) {
	        ctx.status = 400;
	        ctx.body = {
	          error: `expected an object with password but got: ${body}`,
	        }
	        return;
	      }
	      //密码生成
	      body.password = await bcrypt.hash(body.password, 5)
	      var admin = await  opt.find(Admini,{ username: body.username });

	      if (!admin) {
	        const newAdmin = new Admini(body);
	        adminitrator = await newAdmin.save();
	        ctx.status = 200;
	        ctx.body = {
	          message: '注册成功',
	          adminitrator,
	        }
	      } else {
	        ctx.status = 406;
	        ctx.body = {
	          message: '用户名已经存在',
	        }
	      }
	    } catch (error) {
	      ctx.throw(500)
	    }
	})

	/**
	 * @desc y用户登录
	 * @param  {path} '/admini/login' 管理员登录
	 * 
	 */
	router.post('/admin/login', async (ctx, next) => {
		const { body } = ctx.request
		console.log('body', body);
	    try {
	      var admin = await  opt.find(Admini,{ username: body.username });
	      if (!admin) {
	        ctx.status = 401
	        ctx.body = {
	          message: '用户名错误',
	        }
	        return;
	      }
	 
	      // 匹配密码是否相等
	      if (await bcrypt.compare(body.password, admin.password)) {
	      	let {username, authority} = admin
	        ctx.status = 200
	        ctx.body = {
	          message: '登录成功',
	          data: {username, authority},
	          // 生成 token 返回给客户端
	          token: jsonwebtoken.sign({
	            data: JSON.stringify(authority),
	            // 设置 token 过期时间
	            exp: Math.floor(Date.now() / 1000) + (60 * 60 * 3), // 60 seconds * 60 minutes  * 2 = 2 hour
	          }, secret),
	        }


	      } else {
	        ctx.status = 401
	        ctx.body = {
	          message: '密码错误',
	        }
	      }
	    } catch (error) {
	      ctx.throw(500)
	    }
	})

	/**
	 * @description  获取管理员信息
	 */
	router.post('/admin/adminInfo', async (ctx, next) => {
		ctx.body = 'adminInfo'
	})
}

module.exports = adminitrator

// --必须包含 数字,字母,符号 3项组合的 正则表达式
// ^(?:(?=.*[0-9].*)(?=.*[A-Za-z].*)(?=.*[,\.#%'\+\*\-:;^_`].*))[,\.#%'\+\*\-:;^_`0-9A-Za-z]{8,10}$
// --不为纯数字或字母的正在表达式 用于密码验证
// ^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$
// --密码为8~20位数字,英文,符号至少两种组合的字符
// ^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?![,\.#%'\+\*\-:;^_`]+$)[,\.#%'\+\*\-:;^_`0-9A-Za-z]{8,20}$

// {
// 	"username": "admin",
// 	"password": "qwe12345",
// 	"authority": ["开户", "删除账户"]
// }

// {
//   "username": "admin",
//   "password": "$2a$05$yzh1CxgpkRBS4eUiIa.ApO82SQXFjzeH6iu6JO6/6vYax7YGA83YC",
//   "authority": [
//     "开户",
//     "删除账户"
//   ]
// }

























